package br.ucb.cesbdao.janelas;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableRowSorter;

import org.apache.log4j.Logger;

import br.ucb.cesbdao.enuns.EnumLabelAndBotao;
import br.ucb.cesbdao.enuns.EnumResources;
import br.ucb.cesbdao.model.EncaminhamentoModel;
import br.ucb.cesbdao.model.TipoEncaminhamentoDoAtendimentoModel;
import br.ucb.cesbdao.model.impl.EncaminhamentoModelImpl;
import br.ucb.cesbdao.model.impl.TipoEncaminhamentoDoAtendimentoModelImpl;
import br.ucb.cesbdao.modeloTabelas.ModeloTabelaEncaminhamento;
import br.ucb.cesbdao.servicos.JanelaUtil;
import br.ucb.cesbdao.servicos.Servicos;
import br.ucb.cesbdao.servicos.Validadores;

public class JanelaEncaminhamento extends JDialog {
	private static final long serialVersionUID = -5984127092241666477L;
	
	
	private final JPanel contentPanel = new JPanel();
	private JTable jtEncaminhamentoAtnd;
	private JTable jtEncaminhamento;
	private JTextField jtxtEncaminhamentoAtnd;
	private JTextField jtxtEncaminhamento;
	private JScrollPane spEncaminhamentoAtnd;
	private JLabel lblEncaminhamentoAtnd;
	private JButton btnAdd;
	private JButton btnDell;
	private JLabel lblEncaminhamento;
	private JScrollPane spEncaminhamento;
	private ModeloTabelaEncaminhamento modeloTabelaEncaminhamento = new ModeloTabelaEncaminhamento();
	private ModeloTabelaEncaminhamento modeloTabelaEncaminhamentoAtnd = new ModeloTabelaEncaminhamento();
	private static int idAtendimento;
	private JButton btnOk;
	static Logger logger = Servicos.carregaLog(JanelaEncaminhamento.class);

	public static int getIdAtendimento() {
		return idAtendimento;
	}

	public static void setIdAtendimento(int idAtendimento) {
		JanelaEncaminhamento.idAtendimento = idAtendimento;
	}

	/**
	 * Create the dialog.
	 */
	public JanelaEncaminhamento() {
		setTitle(EnumLabelAndBotao.ADD_REMOVE_ENCAMINHAMENTO.getTexto());
		setResizable(false);
		setModal(true);
		setBounds(100, 100, 741, 555);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);

		spEncaminhamentoAtnd = new JScrollPane();

		lblEncaminhamentoAtnd = new JLabel(EnumLabelAndBotao.ENCAMINHAMENTOS_ATEND.getTexto());

		lblEncaminhamento = new JLabel(EnumLabelAndBotao.ENCAMINHAMENTOS.getTexto());

		spEncaminhamento = new JScrollPane();

		btnAdd = new JButton(EnumLabelAndBotao.ADICIONAR.getTexto());
		btnAdd.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				adiciona();
			}
		});

		btnDell = new JButton(EnumLabelAndBotao.REMOVER.getTexto());
		btnDell.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				remover();
			}
		});

		jtxtEncaminhamentoAtnd = new JTextField();
		jtxtEncaminhamentoAtnd.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent e) {
				zeraPreencheTabelaTipoDoAtendimento();
			}
		});
		jtxtEncaminhamentoAtnd.setColumns(10);

		jtxtEncaminhamento = new JTextField();
		jtxtEncaminhamento.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent e) {
				zeraPreencheTabelaTipoAtendimento();
			}
		});
		jtxtEncaminhamento.setColumns(10);
		
		btnOk = new JButton(EnumLabelAndBotao.OK.getTexto());
		btnOk.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				dispose();
			}
		});
		btnOk.setIcon(new ImageIcon(JanelaEncaminhamento.class.getResource(EnumResources.ICONE_SALVAR.getCaminho())));
		
		GroupLayout gl_contentPanel = new GroupLayout(contentPanel);
		gl_contentPanel.setHorizontalGroup(
			gl_contentPanel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPanel.createSequentialGroup()
					.addContainerGap()
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
						.addComponent(spEncaminhamentoAtnd, GroupLayout.DEFAULT_SIZE, 293, Short.MAX_VALUE)
						.addComponent(lblEncaminhamentoAtnd)
						.addComponent(jtxtEncaminhamentoAtnd, GroupLayout.DEFAULT_SIZE, 293, Short.MAX_VALUE))
					.addGap(12)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPanel.createParallelGroup(Alignment.TRAILING)
							.addComponent(btnAdd)
							.addComponent(btnDell))
						.addComponent(btnOk))
					.addGap(10)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING, false)
						.addComponent(jtxtEncaminhamento)
						.addComponent(lblEncaminhamento)
						.addComponent(spEncaminhamento, GroupLayout.DEFAULT_SIZE, 293, Short.MAX_VALUE))
					.addGap(18))
		);
		gl_contentPanel.setVerticalGroup(
			gl_contentPanel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPanel.createSequentialGroup()
					.addGap(6)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
						.addComponent(lblEncaminhamentoAtnd)
						.addComponent(lblEncaminhamento))
					.addGap(18)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
						.addComponent(spEncaminhamentoAtnd, GroupLayout.PREFERRED_SIZE, 428, GroupLayout.PREFERRED_SIZE)
						.addComponent(spEncaminhamento, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
						.addComponent(jtxtEncaminhamento, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(jtxtEncaminhamentoAtnd, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addContainerGap(15, Short.MAX_VALUE))
				.addGroup(Alignment.TRAILING, gl_contentPanel.createSequentialGroup()
					.addContainerGap(145, Short.MAX_VALUE)
					.addComponent(btnAdd, GroupLayout.PREFERRED_SIZE, 62, GroupLayout.PREFERRED_SIZE)
					.addGap(18)
					.addComponent(btnDell, GroupLayout.PREFERRED_SIZE, 66, GroupLayout.PREFERRED_SIZE)
					.addGap(20)
					.addComponent(btnOk)
					.addGap(136))
		);
		gl_contentPanel.linkSize(SwingConstants.VERTICAL, new Component[] {btnAdd, btnDell, btnOk});
		gl_contentPanel.linkSize(SwingConstants.HORIZONTAL, new Component[] {btnAdd, btnDell, btnOk});

		jtEncaminhamento = new JTable();
		jtEncaminhamento.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				if(e.getClickCount() == 2)
					adiciona();
			}
		});
		
		jtEncaminhamento.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jtEncaminhamento.setAutoCreateRowSorter(true);
		spEncaminhamento.setViewportView(jtEncaminhamento);
		jtEncaminhamento.setModel(modeloTabelaEncaminhamento);
		EncaminhamentoModel model = new EncaminhamentoModelImpl();
		modeloTabelaEncaminhamento.setEncaminhamentos(model.getByNotInAtendimento(idAtendimento));

		jtEncaminhamentoAtnd = new JTable();
		jtEncaminhamentoAtnd.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				if(e.getClickCount() == 2){
					remover();
				}
			}
		});
		spEncaminhamentoAtnd.setViewportView(jtEncaminhamentoAtnd);
		jtEncaminhamentoAtnd.setModel(modeloTabelaEncaminhamentoAtnd);
		modeloTabelaEncaminhamentoAtnd.setEncaminhamentos(model.getByIdAtendimento(idAtendimento));
		contentPanel.setLayout(gl_contentPanel);
	}
	private void zeraPreencheTabelaTipoDoAtendimento() {
		modeloTabelaEncaminhamentoAtnd = new ModeloTabelaEncaminhamento();
		jtEncaminhamentoAtnd.setModel(modeloTabelaEncaminhamentoAtnd);
		jtEncaminhamentoAtnd.getTableHeader().setReorderingAllowed(false);
		jtEncaminhamentoAtnd.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jtEncaminhamentoAtnd.setAutoCreateRowSorter(true);
		EncaminhamentoModel model = new EncaminhamentoModelImpl();
		modeloTabelaEncaminhamentoAtnd.setEncaminhamentos(model.getByIdAtendimento(idAtendimento));
		filtraTabelaDoAtendimento();

	}
	private void filtraTabelaDoAtendimento() {
		final TableRowSorter<ModeloTabelaEncaminhamento> sorter = new TableRowSorter<ModeloTabelaEncaminhamento>(modeloTabelaEncaminhamentoAtnd);
		String busca = jtxtEncaminhamentoAtnd.getText();
		JanelaUtil.getInstance().filtrarTabela(busca, sorter,jtEncaminhamentoAtnd, 0);
	}
	private void filtraTabelaAtendimento() {
		final TableRowSorter<ModeloTabelaEncaminhamento> sorter = new TableRowSorter<ModeloTabelaEncaminhamento>(modeloTabelaEncaminhamento);
		String busca = jtxtEncaminhamento.getText();
		JanelaUtil.getInstance().filtrarTabela(busca, sorter, jtEncaminhamento, 0);	
	}

	private void zeraPreencheTabelaTipoAtendimento() {
		modeloTabelaEncaminhamento = new ModeloTabelaEncaminhamento();
		jtEncaminhamento.setModel(modeloTabelaEncaminhamento);
		jtEncaminhamento.getTableHeader().setReorderingAllowed(false);
		jtEncaminhamento.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jtEncaminhamento.setAutoCreateRowSorter(true);
		EncaminhamentoModel model = new EncaminhamentoModelImpl();
		modeloTabelaEncaminhamento.setEncaminhamentos(model.getByNotInAtendimento(idAtendimento));
		filtraTabelaAtendimento();
	}
	
	private void remover() {
		if(jtEncaminhamentoAtnd.getSelectedRow() < 0){
			return;
		}
		TipoEncaminhamentoDoAtendimentoModel model = new TipoEncaminhamentoDoAtendimentoModelImpl();
		model.dell(idAtendimento,modeloTabelaEncaminhamentoAtnd.getEncaminhamentoAt(jtEncaminhamentoAtnd.getSelectedRow()).getIdTipoEncaminha());
		jtxtEncaminhamento.setText("");
		jtxtEncaminhamentoAtnd.setText("");
		zeraPreencheTabelaTipoDoAtendimento();
		zeraPreencheTabelaTipoAtendimento();
	}
	public void adiciona(){
		if(jtEncaminhamento.getSelectedRow() < 0){
			return;
		}
		if(Validadores.validaNewTipoAtende_TipoEncaminha(idAtendimento,modeloTabelaEncaminhamento.getEncaminhamentoAt(jtEncaminhamento.getSelectedRow()).getIdTipoEncaminha())){
			return;
		}
		TipoEncaminhamentoDoAtendimentoModel model = new TipoEncaminhamentoDoAtendimentoModelImpl();
		model.add(idAtendimento,modeloTabelaEncaminhamento.getEncaminhamentoAt(jtEncaminhamento.getSelectedRow()).getIdTipoEncaminha());
		
		jtxtEncaminhamento.setText("");
		jtxtEncaminhamentoAtnd.setText("");
		zeraPreencheTabelaTipoDoAtendimento();
		zeraPreencheTabelaTipoAtendimento();
	}
}
